update2019-08-22 11:40:33
magickパッケージではImageMagick STLという 最も包括的なオープンソースの画像処理のラッパーであり, Rに高品質の画像処理を提供する.
ひとまず以下のインストール~OCRはここを読みながら作成したもの. 何かを追加する場合にはこの下へ追加していく.
CRANから行えるので省略.
## List of 21
## $ version :Class 'numeric_version' hidden list of 1
## $ modules : logi FALSE
## $ cairo : logi TRUE
## $ fontconfig : logi FALSE
## $ freetype : logi TRUE
## $ fftw : logi TRUE
## $ ghostscript : logi TRUE
## $ jpeg : logi TRUE
## $ lcms : logi TRUE
## $ libopenjp2 : logi FALSE
## $ lzma : logi TRUE
## $ pangocairo : logi TRUE
## $ pango : logi TRUE
## $ png : logi TRUE
## $ rsvg : logi TRUE
## $ tiff : logi TRUE
## $ webp : logi TRUE
## $ wmf : logi FALSE
## $ x11 : logi FALSE
## $ xml : logi TRUE
## $ zero-configuration: logi TRUE
LinuxではImageMagick++のインストールが必要になる. 詳しくはここを見て欲しい.
バイナリやテキストに関わらず様々なフォーマットから 直接読み込みを行うことが可能である.
library(magick)
tiger <- image_read_svg('http://jeroen.github.io/images/tiger.svg', width = 400)
print(tiger)## # A tibble: 1 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 400 400 sRGB TRUE 0 72x72
拡張子を変更して書き出すことも余裕. ベクターデータだったものも,ラスターファイルで 作成することが可能.
画像のプレビューには Linuxように次の関数も用意されている.
transformationを学ぶのに最も有効な方法は RStudioで ?transformationsで開かれるヘルプページを 一通りなめることである.
下記の例では,何が出来そうかについて掴んで欲しい.
いつくかのtransformation関数では, geometryを引数に取る. これはAxB+C+Dという形で表現されており, 次のような意味がある.
詳しい構文の方法についてはここを読み込んで欲しい
## # A tibble: 1 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 220 445 sRGB TRUE 73494 72x72
image_fillではスタートポイントと, ファジーレベルを決めてスタートポイントと 同じ色を塗りつぶしていく
ImageMagcikでは標準的な効果がたくさん実装されている.
画像にカーネルを適用するには image_convolve関数を用いる.
これはカーネルたたみ込みを行うと, あるピクセルに対して隣接ピクセルとの重み付け和が 計算される.
kern <- matrix(0, ncol = 3, nrow = 3)
kern[1, 2] <- .25
kern[2, c(1, 3)] <- .25
kern[3, 2] <- .25
kern## [,1] [,2] [,3]
## [1,] 0.00 0.25 0.00
## [2,] 0.25 0.00 0.25
## [3,] 0.00 0.25 0.00
img <- image_resize(logo, "300x300")
image_blurred <- image_convolve(img, kern)
image_append(c(img, image_blurred))標準カーネルについては実装されている. ここを確認して欲しい.
# customize text
image_annotate(
frink,
"CONFIDENTIAL",
size = 30,
color = "red",
boxcolor = "pink",
degrees = 60,
location = "+50+100"
)使えるフォントは “sans”, “mono”, “serif”, “Times”,
“Helvetica”, “Trebuchet”, “Georgia”, “Palatino” “Comic Sans”がある.
すべてのtransformationについては, コピーを返しており, オリジナルファイルへ与える副作用はない.
frink <- image_read("https://jeroen.github.io/images/frink.png")
frink2 <- image_scale(frink, "100")
image_info(c(frink, frink2))つまり,変形を組み合わせるには つなげる必要がある.
test <-
frink %>%
image_rotate(90) %>%
image_background("blue", flatten = TRUE) %>%
image_border("red", "10x10") %>%
image_annotate(
"This is how we combine transformations",
color = "white",
size = 30)
print(test)## # A tibble: 1 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 465 240 sRGB TRUE 0 72x72
これまでに示した例は, 1枚の画像を対象をしたものであった. しかし,magickのすべての関数はベクトルかされており, 複数のレイヤーや合成,アニメーションに対しても動作する.
[, [[, c(), そして, lengthといった 標準のbase関数については,レイヤー群に対しても 使うことが可能である.
earth <-
image_read("https://jeroen.github.io/images/earth.gif") %>%
image_scale("200x") %>%
image_quantize(128)
length(earth)## [1] 44
earth %>%
rev() %>%
image_flip() %>%
image_annotate("meanwhile in Australia", size = 20, color = "white")フォトショップでやるような,画像のスタッキングが行える.
bigdata <- image_read("https://jeroen.github.io/images/bigdata.jpg")
frink <- image_read("https://jeroen.github.io/images/frink.png")
logo <- image_read("https://jeroen.github.io/images/Rlogo.png")
image <-
c(bigdata, logo, frink) %>%
image_scale("300x300") %>%
(function(x) {
image_info(x);
invisible((x))
})()モザイク化すると,すべて画像が収まる大きさに調整される.
flattenを使うと最初の画像の大きさで,モザイクしてくれる.
モザイクとフラットは,合成の方法をしているすることができる. 合成の方法はここを参照して欲しい.
合成により特定の位置で二つの画像を組み合わせることが可能となる.
bigdatafrink <-
frink %>%
image_background("none") %>%
image_rotate(300) %>%
image_scale("x200")
print(bigdatafrink)## # A tibble: 1 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 240 200 sRGB TRUE 0 72x72
PDFドキュメントを読み込んだ際には, ページごとにベクターデータになる. PDFは特定の解像度が求められた際にはすぐさま レンダリングされていることに注意する.
manual <- image_read_pdf(
"https://cloud.r-project.org/web/packages/magick/magick.pdf", density = 72)
image_info(manual)ベクターをレイヤーの要素として取り扱うことに変わり, フレームとして扱いアニメーションを作成することも可能である.
Morphingは連続的にn個の画像を魅せる代わりに, ひとつの画像を他の画像へmorphする. これは アニメーションになる.
newlogo <- image_scale(image_read("https://jeroen.github.io/images/Rlogo.png"), "x150")
oldlogo <- image_scale(image_read("https://developer.r-project.org/Logo/Rlogo-3.png"), "x150")
frames <- image_morph(c(oldlogo, newlogo), frames = 10)
image_animate(frames)GIFやビデオフォーマットのファイルを読み込んだ際には, それぞれのフレームがレイヤーとして読み込む.
banana <- image_read("https://jeroen.github.io/images/banana.gif")
banana <- image_scale(banana, "150")
image_info(banana)それぞれのフレームに背景を追加したアニメーションを作成する.
background <- image_background(
image_scale(logo, "200"),
"white",
flatten = TRUE
)
frames <- image_composite(background, banana, offset ="+70+30")
animation <- image_animate(frames, fps = 10)
print(animation)## # A tibble: 8 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 gif 200 155 sRGB TRUE 0 72x72
## 2 gif 200 155 sRGB TRUE 0 72x72
## 3 gif 200 155 sRGB TRUE 0 72x72
## 4 gif 200 155 sRGB TRUE 0 72x72
## 5 gif 200 155 sRGB TRUE 0 72x72
## 6 gif 200 155 sRGB TRUE 0 72x72
## 7 gif 200 155 sRGB TRUE 0 72x72
## 8 gif 200 155 sRGB TRUE 0 72x72
image_backgroundのflattenは 背景となるものを敷くイメージ. flattenがFALSEだと背景が埋まっていないので, 合成する次のように積集合のような絵ができる.
background <- image_background(
image_scale(logo, "200"),
"white",
flatten = FALSE
)
frames <- image_composite(background, banana, offset ="+70+30")
animation <- image_animate(frames, fps = 10)
print(animation)## # A tibble: 8 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 gif 200 155 sRGB TRUE 0 72x72
## 2 gif 200 155 sRGB TRUE 0 72x72
## 3 gif 200 155 sRGB TRUE 0 72x72
## 4 gif 200 155 sRGB TRUE 0 72x72
## 5 gif 200 155 sRGB TRUE 0 72x72
## 6 gif 200 155 sRGB TRUE 0 72x72
## 7 gif 200 155 sRGB TRUE 0 72x72
## 8 gif 200 155 sRGB TRUE 0 72x72
アニメーションは次で出力する.
グラフィックオブジェクトを作成するimage_graphはpngのような 関数と同様の機能を有する.
fig <- image_graph(width = 400, height = 400, res = 96)
ggplot2::qplot(mpg, wt, data = mtcars, colour = cyl)
dev.off()## png
## 2
グラフィックオブジェクトが作成されていることで, 通常の画像操作を扱うことができる.
## # A tibble: 1 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 400 400 sRGB TRUE 0 72x72
グラフィックの他の使い方としてぇあ, ピクセル座標値を使い画像に絵を描いていく方法がある.
img <- image_draw(frink)
rect(20, 20, 200, 100, border = "red", lty = "dashed", lwd = 5)
abline(h = 300, col = 'blue', lwd = '10', lty = "dotted")
text(30, 250, "Hoiven-Glaven", fmamily = "monospace", cex = 4, srt = 90)## Warning in text.default(30, 250, "Hoiven-Glaven", fmamily = "monospace", :
## "fmamily" はグラフィックスパラメータではありません
palette(rainbow(11, end = .9))
symbols(rep(200, 11), seq(0, 400, 40), circles = runif(11, 5, 35),
bg = 1:11, inches = FALSE, add = TRUE)
dev.off()## png
## 2
## # A tibble: 1 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 220 445 sRGB TRUE 0 72x72
グラフを描画しているimage_drawでは すべてのマージンをゼロにしており,左上が0,0の座標である. マージンをどの程度にするのかは引数で設定が可能である.
graphicsデバイスを使うことでマルチフレーム機能を サポートしており,アニメの作成が容易となる.
library(gapminder)
library(ggplot2)
img <- image_graph(600, 340, res = 96)
datalist <- split(gapminder, gapminder$year)
out <- lapply(datalist, function (data) {
p <-
ggplot(data, aes(gdpPercap, lifeExp, size = pop, color = continent)) +
scale_size("population", limits = range(gapminder$pop)) +
geom_point() +
ylim(20, 90) +
scale_x_log10(limits = range(gapminder$gdpPercap)) +
ggtitle(data$year) +
theme_classic()
print(p)
})
dev.off()## png
## 2
## # A tibble: 12 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 gif 600 340 sRGB TRUE 0 72x72
## 2 gif 600 340 sRGB TRUE 0 72x72
## 3 gif 600 340 sRGB TRUE 0 72x72
## 4 gif 600 340 sRGB TRUE 0 72x72
## 5 gif 600 340 sRGB TRUE 0 72x72
## 6 gif 600 340 sRGB TRUE 0 72x72
## 7 gif 600 340 sRGB TRUE 0 72x72
## 8 gif 600 340 sRGB TRUE 0 72x72
## 9 gif 600 340 sRGB TRUE 0 72x72
## 10 gif 600 340 sRGB TRUE 0 72x72
## 11 gif 600 340 sRGB TRUE 0 72x72
## 12 gif 600 340 sRGB TRUE 0 72x72
Magickの画像はRのベースグラフィックで使うための ラスターオブジェクトに変換することができる. そのため.Magickの画像は他のグラフィックツールとも連携できる. しかし,Rのラスターオブジェクトは遅く,座標系が違ううえ, 品質が下がる.
パッケージgridを使うことでグラフィックデバイスに ラスターオブジェクトを重ねることは行いやすい.
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## # A tibble: 1 x 7
## format width height colorspace matte filesize density
## <chr> <int> <int> <chr> <lgl> <int> <chr>
## 1 PNG 640 480 sRGB TRUE 23359 72x72
## This is a lot of 12 point text to test the
## ocr code and see if it works on all types
## of file format.
##
## The quick brown dog jumped over the
## lazy fox. The quick brown dog jumped
## over the lazy fox. The quick brown dog
## jumped over the lazy fox. The quick
## brown dog jumped over the lazy fox.